perm filename DPYXGP.SAI[X,ALS]1 blob
sn#073877 filedate 1973-11-25 generic text, type T, neo UTF8
00100 BEGIN "DPYXGP"
00200
00300 REQUIRE "PROLOG.HDR[1,PDQ]" SOURCE_FILE;
00400 REQUIRE "TTYSUB.HDR[1,PDQ]" SOURCE_FILE;
00500 REQUIRE "BOLIB.HDR[1,BO]" SOURCE_FILE;
00600
00700 SIMPROC BREAK;BEGIN END;
00800
00900
01000 DEFINE XGPWID="1700",LMAR="50",RMAR="(XGPWID-50)",SCL="(1600/1400)";
01100
01200 INTEGER SIMPROC SCLFN(INTEGER X);RETURN(SCL*(X+700));
01300
01400 INTEGER VECMAX;
01500 DEFINE STRMAX="300";
01600 DEFINE PTWID="0";
01700
01800 PRELOAD_WITH "FIX13X","FIX20","FIX20","FIX25","FIX40","BDR40","SIGN57";
01900 STRING ARRAY FONTNAME[1:7];
02000
02100 PRELOAD_WITH 10,12,12,16,25,25,50;
02200 INTEGER_ARRAY FONTSIZE[1:7];
02300
02400 PRELOAD_WITH 8,12,14,16,24,32,48;
02500 INTEGER_ARRAY CHSIZES[1:7];
02600
02700 SAFE BOOLEAN ARRAY CHTAB[1:7];
02800
02900 INTEGER SIMPROC XTEND(INTEGER X,MSK);
03000 START_CODE MOVE 1,X;MOVE 2,MSK;TDNE 1,2;ORCMI 1,-1(2);END;
03100
03200 INTEGER VARWID,VECWID;
03300
00100 PROCEDURE DPYXGP(INTEGER_ARRAY DPYBUF;STRING ODEV);
00200 BEGIN
00300 INTEGER_ARRAY Y0,PV,X0,XN,YN,WS[1:VECMAX];
00400 INTEGER_ARRAY PS,YS,XS,CS[1:STRMAX];
00500 STRING_ARRAY STRS[1:STRMAX];
00600 INTEGER YMIN,YMAX;
00700 INTEGER BUFMAX,X,Y,I,J,JS,CHSIZ;
00800
00900
01000 SIMPROC MKVEC(INTEGER C,VX,VY);
01100 BEGIN LABEL L;
01200 IF C≥4 THEN C←C LAND 3
01300 ELSE BEGIN VX←X+VX;VY←Y+VY;END;
01400 CASE C OF
01500 BEGIN
01600 BEGIN "VISIBLE VECTOR"
01700 INTEGER YT,XT,YB,XB,S,SN,DX,DY;
01800 YT←SCLFN(Y);XT←SCLFN(X);YB←SCLFN(VY);XB←SCLFN(VX);
01900 ⊃ larger Y coordinate at top;
02000 IF YB>YT∨YB=YT∧XB<XT THEN BEGIN YT↔YB;XT↔XB;END;
02100 DX←XT-XB;DY←YT-YB;
02200 SN←IF 10*ABS(DY)<ABS(DX) ∧ DY≠0 THEN VECWID ELSE 1;
02300 IF XT<0∧XB<0∨XT>RMAR∧XB>RMAR THEN GO TO L;
02400 IF XT>RMAR THEN BEGIN XT←RMAR;YT←YB+DY*(RMAR-XB)/DX;END
02500 ELSE IF XT<0 THEN BEGIN XT←0;YT←YB-DY*XB/DX;END;
02600 DX←XT-XB;DY←YT-YB;
02700 IF XB>RMAR THEN BEGIN XB←RMAR;YB←YT+DY*(RMAR-XT)/DX;END
02800 ELSE IF XB<0 THEN BEGIN XB←0;YB←YT-DY*XT/DX;END;
02900
03000 FOR S←1 STEP 1 UNTIL SN DO
03100 BEGIN Y0[J]←YT;X0[J]←XT;YN[J]←YB;XN[J]←XB;
03200 WS[J]←IF SN=1 THEN VECWID ELSE 1;
03300 PV[J]←J;J←J+1;YT←YT-1;YB←YB-1;
03400 END;
03500 L: END "VISIBLE VECTOR";
03600 BEGIN "ENDPOINT VECTOR"
03700 YN[J]←Y0[J]←SCLFN(VY);XN[J]←X0[J]←SCLFN(VX);
03800 WS[J]←VECWID+2;PV[J]←J;J←J+1;
03900 END "ENDPOINT VECTOR";
04000 BEGIN ⊃ INVISIBLE VECTOR; END;
04100 BEGIN ⊃ UNUSED; END;
04200 END;
04300 X←VX;Y←VY;
04400 YMAX←SCLFN(Y) MAX YMAX;YMIN←SCLFN(Y) MIN YMIN;
04500 END "MKVEC";
04600
04700 SIMPROC MKSVEC(INTEGER WD);
04800 MKVEC(WD LAND 3,
04900 XTEND(LDB(POINT(7,WD,26)),'100),
05000 XTEND(LDB(POINT(7,WD,33)),'100));
05100
05200 SIMPROC XGPSTR(STRING S);
05300 BEGIN INTEGER CHSZ,N,CHWID,XX,L,K,C;
05400 STRING TS;
05500 CHTAB[CHSIZ]←TRUE;
05600 CHSZ←CHSIZES[CHSIZ];
05700 CHWID←FONTSIZE[CHSIZ];
05800 XX←XS[JS]←SCLFN(X-CHSZ DIV 2);
05900 YS[JS]←SCLFN(Y+CHSZ);PS[JS]←JS;
06000 TS←NULL;WHILE S DO IF (C←LOP(S))=0 THEN DONE ELSE TS←TS&C;
06100 S←TS;
06200 N←(L←LENGTH(S)) MIN ((RMAR-XX) DIV CHWID);
06300 K←IF XX<0 THEN -XX DIV CHWID+1 ELSE 1;
06400 IF XX<0 THEN XX←0;
06500 IF N<L THEN BEGIN OUTSTR("PAGE OVERFLOW WITH STRING="&S);OUTSTR(CRLF);END;
06600 IF N<1∨K>N THEN BEGIN OUTSTR("N= "&
06650 CVS(N)&" L= "&CVS(L)&" K= "&CVS(K)&" S= "&S&CRLF);RETURN;END;
06700 STRS[JS]←S[K TO N];
06800 CS[JS]←CHSIZ;JS←JS+1;
06900 X←X+CHSZ*L;
07000 END "XGPSTR";
07100
07200
00100 BEGIN "IIICVT"
00200 INTEGER OP,IIIWD;
00300 ARRCLR(Y0,1 LSH 35);
00400 ARRCLR(YS,1 LSH 35);
00500 ARRCLR(CHTAB,FALSE);
00600
00700 BUFMAX←ARRINFO(DPYBUF,0);
00800 J←JS←1;
00900 CHSIZ←2;
01000 YMIN←2200;YMAX←0;
01100 X←Y←0;
01200 FOR I←1 STEP 1 UNTIL BUFMAX DO
01300 BEGIN
01400 IIIWD←DPYBUF[I];
01500 OP←IIIWD LAND '17;
01600 IF IIIWD LAND 1 THEN
01700 BEGIN
01800 STRING STR;
01900 STR←CVSTR(IIIWD);
02000 WHILE (IIIWD←DPYBUF[I+1]) LAND 1 DO
02100 BEGIN I←I+1;STR←STR&CVSTR(IIIWD);END;
02200 XGPSTR(STR)
02300 END
02400 ELSE IF OP=2 THEN
02500 BEGIN "SHORT VECTORS"
02600 MKSVEC(IIIWD LSH -'24);
02700 MKSVEC(IIIWD LSH -4);
02800 END "SHORT VECTORS"
02900 ELSE IF OP=6 THEN
03000 BEGIN "LONG VECTOR"
03100 INTEGER C;
03200 C←LDB(POINT(3,IIIWD,27));
03300 IF C THEN CHSIZ←C;
03400 C←LDB(POINT(3,IIIWD,24));
03500 IF VARWID∧C THEN VECWID←C;
03600 MKVEC(LDB(POINT(3,IIIWD,31)),
03700 XTEND(LDB(POINT(11,IIIWD,10)),'2000),
03800 XTEND(LDB(POINT(11,IIIWD,21)),'2000));
03900 END "LONG VECTOR";
04000 IF J>VECMAX THEN BEGIN OUTSTR("TOO MANY VECTORS"&CRLF);DONE;END;
04100 END;
04200
04300 ⊃ now the vector and string lists have been constructed;
04400
04500 J←J-1;JS←JS-1;
04600
04700 END "IIICVT";
04800 SORT(Y0,PV); ⊃ sort the vectors;
04900 SORT(YS,PS); ⊃ sort the strings;
05000
00100 IFC FALSE THENC
00200 BEGINC
00300 BEGIN INTEGER I,K;
00400 INTEGER_ARRAY DPYBUF[1:2000];
00500 REQUIRE "DPYSUB.HDR[1,PDQ]" SOURCE_FILE;
00600 DPYSET(DPYBUF);
00700 FOR I←1 STEP 1 UNTIL J DO
00800 BEGIN
00900 K←PV[I];
01000 GVECT(X0[K],Y0[I],'146,0,WS[K]);
01100 AVECT(XN[K],YN[K]);
01200 END;
01300 FOR I←1 STEP 1 UNTIL JS DO
01400 BEGIN K←PS[I];
01500 GVECT(XS[K],YS[I],'146,CS[K],0);
01600 DPYSST(STRS[K]);
01700 END;
01800 DPYOUT(1);
01900 END;
02000 ENDC;
02100
00100 BEGIN "XGPOUT"
00200
00300 INTEGER CHN,JMAX,JSMAX,K,I,N,DX,WX,WID,VECWID,WX2,VW2;
00400
00500 INTEGER CCNT,OUTWD,XG,FSL,YOFF,YBOT;
00600
00700 SIMPROC COUT(INTEGER C);
00800 IF XG=0 THEN OUT(CHN,C )
00900 ELSE
01000 BEGIN
01100 INTEGER PT;
01200 IF CCNT=0 THEN BEGIN WORDOUT(CHN,OUTWD);OUTWD←0;CCNT←5;PT←POINT(7,OUTWD,-1);END;
01300 IDPB(C,PT);CCNT←CCNT-1;
01400 END;
01500
01600 SIMPROC XOUT(INTEGER X);
01700 BEGIN X←((X+LMAR) MAX 0) MIN XGPWID;
01800 COUT(X LSH -7);COUT(X);
01900 END "XOUT";
02000
02100 INTEGER YLAST,STAT;
02200
02300 SIMPROC YOUT(INTEGER Y);
02400 BEGIN Y←YOFF-Y;
02500 Y←(Y MAX 0) MIN YBOT;
02600 IF Y<YLAST THEN OUTSTR("VECTORS OUT OR ORDER"&CRLF);
02700 YLAST←Y;
02800 COUT(Y LSH -7);COUT(Y);
02900 END "YOUT";
03000
03100 BOOLEAN SIMPROC MTAP(INTEGER CHN,ADR);
03200 START_CODE
03300 HRLZ 2,CHN;LSH 2,5;TLO 2,'072000;HRR 2,ADR;MOVEI 1,0;XCT 2;SETOM 1;
03400 END "MTAP";
03500
03600 INTEGER PROCEDURE XGPSTAT;
03700 BEGIN INTEGER_ARRAY BLK[0:4];
03800 BLK[0]←0;
03900 MTAP(CHN,LOC(BLK[0])); ⊃ GET XGP STATUS;
04000 IF BLK[1]≠0 THEN
04100 OUTSTR("XGP LOSSAGE, STATUS BITS="&CVOS(BLK[1])&
04200 ","&CVOS(BLK[2])&","&CVOS(BLK[3])&CRLF);
04300 RETURN(BLK[1]);
04400 END "XGPSTAT";
04500
04600 PROCEDURE FONTSEL(INTEGER I;STRING FNAM);
04700 BEGIN INTEGER_ARRAY BLK[0:4];
04800 BLK[0]←1;BLK[1]←CVSIX(FNAM);BLK[2]←CVSIX("FNT");BLK[3]←CVSIX("XGPSYS");
04900 BLK[4]←I;
05000 MTAP(CHN,LOC(BLK[0]));
05100 XGPSTAT;
05200 END "FONTSEL";
05300
05400 XG←IF ODEV="XGP" THEN 0 ELSE '14;
05500 CHN←GETCHAN;
05600 OPEN(CHN,ODEV,XG,0,4,0,0,0);
05700 ENTER(CHN,"X.X",0);
05800 IF XG=0 THEN FOR I←1 STEP 1 UNTIL 7 DO
05900 IF CHTAB[I] THEN FONTSEL(I,FONTNAME[I]);
06000
06100 JMAX←J+1;JSMAX←JS+1;
06200 CCNT←0;
06300 J←JS←1;
06400 FSL←0;
06500 YOFF←IF YMAX<1950∧YMIN>0 THEN 1950
06600 ELSE IF YMAX-YMIN≤2200 THEN 1100-(YMAX+YMIN) DIV 2
06700 ELSE YMAX;
06800 BEGIN INTEGER_ARRAY BLK[0:6];
06900 BLK[0]←3;
07000 YBOT←BLK[2]←IF YMAX-YMIN>2200 THEN YMAX-YMIN ELSE 2200;
07100 BLK[3]←1;
07200 BLK[5]←4000;
07300 MTAP(CHN,LOC(BLK[0]));
07400 END;
07500
07600 YLAST←0;
07700 WHILE TRUE DO
07800 BEGIN
07900 IF J≥JMAX∧JS≥JSMAX THEN DONE;
08000 WHILE J<JMAX ∧ (JS≥JSMAX∨Y0[J]≥YS[JS]) DO
08100 BEGIN INTEGER XL;
08200 PROCEDURE LINOUT(INTEGER X,Y,DX,N,WID);
08300 BEGIN
08400 COUT('177);COUT(4);
08500 YOUT(Y);XOUT(XL);
08600 COUT(DX LSH -14);COUT(DX LSH -7);COUT(DX);
08700 COUT(N LSH -7);COUT(N);
08800 COUT(WID LSH -7);COUT(WID);
08900 END "LINOUT";
09000 K←PV[J];
09100 VECWID←WS[K];
09200 VW2←VECWID DIV 2;
09300 XL←X0[K];
09400 WX←(XN[K]-X0[K]);
09500 WX2←IF WX<0 THEN WX-VECWID ELSE WX+VECWID;
09600 N←(Y0[J]-YN[K])+1; ⊃ guaranteed to be >0;
09700 IF N>ABS(WX)+1 THEN
09800 BEGIN DX←(WX LSH 9) DIV (N-1);
09900 WID←ABS(DX)*VECWID LSH -9+VECWID;
10000 IF DX<0 THEN XL←XL-VW2;
10100 END
10200 ELSE IF N>1 THEN
10300 BEGIN DX← (WX2 LSH 9) DIV N;
10400 WID←ABS(DX)*VECWID LSH -9+VECWID;
10500 ⊃ N←N+1-VECWID;
10600 IF DX<0 THEN XL←XL-(WID+DX DIV 700)+VECWID;
10700 END
10800 ELSE BEGIN DX←0;
10900 WID←ABS(WX2);
11000 N←VECWID;
11100 END;
11200 XL←XL-VW2;
11300 LINOUT(XL,Y0[J],DX,N,WID);
11400 J←J+1;
11500 END;
11600 WHILE JS<JSMAX ∧ (J≥JMAX∨YS[JS]≥Y0[J]) DO
11700 BEGIN STRING S;
11800 INTEGER X,C,CH;
11900 K←PS[JS];
12000 C←CS[K];
12100 IF FSL≠C THEN
12200 BEGIN FSL←CS[K]; ⊃ SET FONT;
12300 COUT('177);COUT(1);COUT(FSL);
12400 END;
12500 COUT('177);COUT(3); ⊃ SET SCAN LINE NUMBER;
12600 YOUT(YS[JS]);
12700 COUT('177);COUT(1);COUT('40); ⊃ SET COLUMN NUMBER;
12800 XOUT(X←XS[K]);
12900 S←STRS[K];
13000 WHILE S DO
13100 BEGIN CH←LOP(S);IF CH=NULL THEN DONE;COUT(CH);END;
13200 COUT(LF);
13300 JS←JS+1;
13400 END;
13500 END;
13600
13700 IF XG∧CCNT>0 THEN WORDOUT(CHN,OUTWD);
13800 CLOSE(CHN);
13900 STAT←XGPSTAT;
14000 RELEASE(CHN);
14100
14200 END "XGPOUT";
14300 END "DPYXGP";
14400
00100 BEGIN "XGPRUN"
00200 STRING FILE,ODEV;
00300 INTEGER CHN,FLG,MFLG,SIZE,FOO;
00400 VECWID←1; ⊃ VECWID←ININT("LINE WIDTH←");
00500 VARWID←VECWID=0;
00600 IF VARWID THEN VECWID←2;
00700
00800 ODEV←"XGP"; ⊃ ODEV←STRIN("OUTPUT DEVICE=");
00900 WHILE TRUE DO
01000 BEGIN OPEN(CHN←GETCHAN,"DSK",'14,1,0,0,0,0);
01100 WHILE TRUE DO
01200 BEGIN FILE←"PLOTX.GRF[11,ALS]"; ⊃ FILE←STRIN("FILE=");
01300 LOOKUP(CHN,FILE,FLG);IF FLG=0 THEN DONE;
01400 LOOKUP(CHN,FILE&".GRF",FLG);IF FLG=0 THEN DONE;
01500 END;
01600 FOO←WORDIN(CHN);SIZE←WORDIN(CHN);WORDIN(CHN);
01700 BEGIN
01800 INTEGER_ARRAY DPYBUF[1:SIZE+2];
01900 ARRYIN(CHN,DPYBUF[1],SIZE+1);
02000 VECMAX←2*SIZE;
02100 RELEASE(CHN);
02200 DPYXGP(DPYBUF,ODEV);
02300 END;
02400
02500 END;
02600 END "XGPRUN";
02700
02800 END "DPYXGP";
02900
03000